const  Router  =  require('koa-router');
const  router  =  new   Router();
const  User = require('../model/User');
const  bcrypt = require('bcryptjs');
var    gravatar = require('gravatar');
const  tools= require('../../config/tools');
var jwt = require('jsonwebtoken');
const  keys=require('../../config/key');
const passport = require('koa-passport')
//引入input 验证
const  validatorRegisterInput =require('../validation/register');
const  validatorLoginInput =require('../validation/login');
/*
  get  请求
  注册接口
  http://localhost:5000/api/user/test
*/
router.get('/test',async  ctx=>{
    ctx.status=200;
    ctx.body={ msg:'hell  world  111'};  //{"msg":"hell  world  111"}
})

/* 
   post  请求
   localhost:5000/api/user/register
*/
router.post('/register',async  ctx=>{
  //input  验证
  const  {errors, isValid} = validatorRegisterInput(ctx.request.body);
  if(!isValid) {
      ctx.status=400;
      ctx.body =errors;
      return  ;
  }
  //查询数据库并且储存得到的数据
  const  findResult=await User.find({
     email:ctx.request.body.email
  });
  // console.log(findResult);
  //1.在数据库中查询到该邮箱
  if(findResult.length>0) {
    ctx.status=500;
    ctx.body= {
       email:'邮箱已经存在'
    }
  } 
  //2.没有查询到，储存起来
  else { 
      //全球公用头像的使用
      const avatar = gravatar.url(ctx.request.body.email, 
        {s: '200', r: 'pg', d: 'mm'
      });
      const  newUser=new User({
         name:ctx.request.body.name,
         email:ctx.request.body.email,
         avatar,
         password: tools.enbcrypt(ctx.request.body.password)
      });
        // console.log(newUser);
        // 存储到数据库
        await newUser
        .save()
        .then(user => {
          ctx.body = user;
        })
        .catch(err => {
          console.log(err);
        });
      // 返回json数据
      ctx.body = newUser;
      
  }

})

/* 
  post  请求
  登陆接口
   localhost:5000/api/user/login
   从数据库查询email
   如果邮箱不存在就输出404
   如果邮箱存在，就判断密码是否正确，密码正确，输出success:true
                                  密码错误，输出password:'密码错误'
*/
router.post('/login',async  ctx=>{
  //input  验证
  const  {errors, isValid} = validatorLoginInput(ctx.request.body);
  if(!isValid) {
      ctx.status=400;
      ctx.body =errors;
      return  ;
  }
  //数据库查询到的结果
  const  findEmail=await User.find({
    email:ctx.request.body.email
  });
  const  user    =  findEmail[0];
  const  password = ctx.request.body.password;
  if(findEmail.length==0) {
    ctx.status=404;
    ctx.body= {
      email:'邮箱不存在'
    }
  }else {
     // 查到后 验证密码
     var result = await bcrypt.compareSync(password, user.password);

     // 验证通过
     if (result) {
       // 返回token
       //返回什么样的参数
       const payload = { id: user.id, name: user.name, avatar: user.avatar };

       const token = jwt.sign(payload, keys.secretOrKey, { expiresIn: 3600 });
 
       ctx.status = 200;
       ctx.body = { success: true, token: 'Bearer ' + token };
     } else {
       ctx.status = 400;
       ctx.body = { password: '密码错误!' };
     }
  }
})
/* 
    get 请求
    api/user/current
    用户信息接口  返回用户信息
*/
/**
 * @route GET api/users/current
 * @desc  用户信息接口地址 返回用户信息
 * @access 接口是私密的
 */
router.get(
  '/current',
  passport.authenticate('jwt', { session: false }),
  async ctx => {
    ctx.body = {
      id: ctx.state.user.id,
      name: ctx.state.user.name,
      email: ctx.state.user.email,
      avatar: ctx.state.user.avatar
    };
  }
);
module.exports = router.routes();
